/**
 * @file QWF_Include.h
 * @brief QWF框架通用头文件（集中管理跨模块公共定义，包含电机限幅、枚举类型等）
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-07
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @par 修改日志:
 * - 2025-08-07: 初始版本，定义框架基础公共宏及枚举类型
 * 
 * @bug 待解决问题: 暂无已知问题
 */
#ifndef QWF_INCLUDE
#define QWF_INCLUDE
#include "QWF_Custom_Ctrl.h"
/*存放常用需要引用的定义，便于统一化分组管理*/

/*==================== 常用电机限幅宏定义 ====================*/
/* 定义不同型号电机的最大输出限制（单位：e-3A，即毫安），用于PID输出限幅保护 */
#define DJI_c610_output_max			(10000)		/* C610电调最大输出电流（10A） */
#define DJI_c620_output_max			(16384-4384)	/* C620电调最大输出电流（12000e-3A，即12A，减去安全冗余） */
#define DJI_gm6020_old_output_max	(28000-3000)	/* 老款GM6020电机（仅电压控制）最大输出（25000e-3A，即25A） */
#define DJI_gm6020_new_v_output_max	(25000-3000)	/* 新款GM6020电机（电压控制模式）最大输出（22000e-3A，即22A） */
#define DJI_gm6020_new_i_output_max	(16384-1000)	/* 新款GM6020电机（电流控制模式）最大输出（15384e-3A，即15.384A） */
#define DJI_gm6020_angle_dead	(0.05*360.0/8192)	/* GM6020角度死区（0.05度，避免微小角度波动触发控制） */

/* PID控制限幅参数 */
#define angle_pid_max			(10000)	/* 角度环PID输出最大值（用于限制角度控制输出幅度） */
#define pid_i_max				(1000)	/* PID积分项最大值（防止积分饱和导致超调） */

/*==================== 电机类型枚举（区分不同型号电机） ====================*/
/**
 * @brief 电机类型枚举（用于区分不同型号电机的控制逻辑）
 * @note 从0开始编号，0表示未定义类型，1~8为具体电机型号
 */
typedef enum{
	undef_motor=0	,	// 未定义电机类型（默认值，避免未初始化风险）
	DJI_gm6020_old	,	// 老款GM6020电机（仅支持电压控制模式）
	DJI_gm6020_new_i,	// 新款GM6020电机（电流控制模式）
	DJI_gm6020_new_v,	// 新款GM6020电机（电压控制模式）
	DJI_c610		,	// C610电调配套电机（常见于小型执行机构）
	DJI_c620		,	// C620电调配套电机（常见于底盘驱动）
	DJI_Motor		,	// 通用大疆电机类型（兼容未明确型号的大疆电机）
	DM_mit			,	// 达妙MIT系列电机（高精度伺服电机）
	DM_Motor		,	// 通用达妙电机类型（兼容未明确型号的达妙电机）
}Motor_Type_e;

/*==================== 时间点枚举（存储不同时刻数据） ====================*/
/**
 * @brief 时间点枚举（用于存储传感器或控制变量的历史数据）
 * @note 用于实现差分计算（如速度=当前值-上一时刻值）
 */
typedef enum{
	now=0,		// 当前时刻（最新数据）
	last,		// 上一时刻（前一次采样数据）
	last_2,		// 上两时刻（前前次采样数据）
}QWF_Time;

/*==================== 三维坐标枚举（XYZ轴标识） ====================*/
/**
 * @brief XYZ坐标轴枚举（用于三维空间坐标的维度标识）
 * @note 配合结构体或数组使用，提高代码可读性（如data[x]表示X轴数据）
 */
typedef enum{
	x=0,		// X轴（通常为前进方向）
	y,			// Y轴（通常为左右方向）
	z,			// Z轴（通常为垂直方向）
}QWF_XYZ_Coords;

/*==================== 欧拉角枚举（姿态控制） ====================*/
/**
 * @brief PYR欧拉角枚举（用于姿态控制中的角度标识）
 * @note 配合IMU数据使用，明确区分俯仰、偏航、滚转角度
 */
typedef enum{
	pitch=0,	// 俯仰角（Pitch，绕Y轴旋转角度）
	yaw,		// 偏航角（Yaw，绕Z轴旋转角度）
	roll,		// 滚转角（Roll，绕X轴旋转角度）
}QWF_PYR_Coords;

/*==================== 底盘轮子类型枚举（底盘控制） ====================*/
/**
 * @brief 底盘轮子类型枚举(仅包括使用功率的轮子)
 * @note 配合底盘运动学计算使用，明确各轮子的位置和类型
 */
typedef enum{
	f_helm=0	,	// 前舵轮（负责转向）
	b_helm		,	// 后舵轮（负责转向）
	f_wheel		,	// 前轮（负责驱动）	
	b_wheel		,	// 后轮（负责驱动）
	l_wheel		,	// 左轮（负责驱动）
	r_wheel		,	// 右轮（负责驱动）
	chassis_wheel_num	// 底盘轮子总数（用于数组大小定义，值为6）
}chassis_wheel;

/*==================== 云台电机类型枚举（云台控制） ====================*/
/**
 * @brief 云台电机类型枚举（用于标识云台各电机的功能）
 * @note 配合云台角度控制使用，明确各电机的控制目标（如俯仰、偏航）
 */
typedef enum{
	Pitch=0	,	// 俯仰电机（控制云台上下摆动）
	Yaw		,	// 偏航电机（控制云台左右旋转）
	Fire_L	,	// 左发射轮电机（控制弹丸发射）
	Fire_R	,	// 右发射轮电机（控制弹丸发射）
	Knob	,	// 旋钮电机（控制参数调节）
	gimbal_motor_num	// 云台电机总数（用于数组大小定义，值为5）
}gimbal_motor;

#endif
